package com.huawei.util;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 使用 Apache POI 库读取 Excel 文件（支持 .xls 和 .xlsx）的 Java 工具类，提供了两个方法：
 *
 * readExcelToList(String filePath)：返回 List<List<String>>，每行是一个 List<String>。
 * readExcelToArray(String filePath)：返回 String[][]，二维字符串数组。
 */
public class ApachePOIExcelReader {

    /**
     * 读取 Excel 文件，返回 List<List<String>>
     *
     * @param filePath Excel 文件路径（支持 .xls 和 .xlsx）
     * @return 表格数据，每行是一个 List<String>
     * @throws IOException 文件读取异常
     */
    public static List<List<String>> readExcelToList(String filePath) throws IOException {
        List<List<String>> data = new ArrayList<>();
        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = getWorkbook(fis, filePath)) {

            Sheet sheet = workbook.getSheetAt(0); // 读取第一个工作表

            for (Row row : sheet) {
                List<String> rowData = new ArrayList<>();
                for (Cell cell : row) {
                    rowData.add(getCellValueAsString(cell));
                }
                data.add(rowData);
            }
        }
        return data;
    }

    /**
     * 读取 Excel 文件，返回 String[][]
     *
     * @param filePath Excel 文件路径
     * @return 二维字符串数组
     * @throws IOException 文件读取异常
     */
    public static String[][] readExcelToArray(String filePath) throws IOException {
        List<List<String>> listData = readExcelToList(filePath);

        // 计算最大列数（避免数组越界）
        int maxCols = 0;
        for (List<String> row : listData) {
            if (row.size() > maxCols) {
                maxCols = row.size();
            }
        }

        String[][] array = new String[listData.size()][maxCols];
        for (int i = 0; i < listData.size(); i++) {
            List<String> row = listData.get(i);
            for (int j = 0; j < row.size(); j++) {
                array[i][j] = row.get(j);
            }
            // 剩余列自动为 null（或可初始化为空字符串）
        }
        return array;
    }

    // 根据文件扩展名创建对应的 Workbook
    private static Workbook getWorkbook(FileInputStream fis, String filePath) throws IOException {
        if (filePath.toLowerCase().endsWith(".xlsx")) {
            return new XSSFWorkbook(fis);
        } else if (filePath.toLowerCase().endsWith(".xls")) {
            return new HSSFWorkbook(fis);
        } else {
            throw new IllegalArgumentException("不支持的文件格式: " + filePath);
        }
    }

    // 将 Cell 转换为字符串
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    // 避免科学计数法，保留原样（如身份证号会被转为数字）
                    double value = cell.getNumericCellValue();
                    // 如果是整数，去掉小数点
                    if (value == Math.floor(value)) {
                        return String.format("%.0f", value);
                    } else {
                        return String.valueOf(value);
                    }
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                try {
                    return cell.getStringCellValue();
                } catch (IllegalStateException e) {
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BLANK:
            case ERROR:
            default:
                return "";
        }
    }
}
